import { FileChange, LcCommit } from '@/types/modules/editor/types/commit.type';
import { DocFrameType, LcDocument } from '../../types/editor.type';

export interface FileSystemStats {
  type: 'file' | 'directory';
  size: number;
  createTime: number;
  modifyTime: number;
  modifyBy?: number;

  // 通用元数据
  title?: string;
  description?: string;
  width?: number;
  height?: number;
  screenshot?: LcDocument['screenshot'];

  // 组件元数据
  tsxType?: 'Page' | 'Component';
  portal?: boolean;
  frames?: DocFrameType[];
  route?: LcDocument['route'];
  // 类型元数据

  /* 文件夹约定路由 */
  routePath?: string;
  /* 文件夹内页面不套在上层布局组件 */
  noLayout?: boolean;

  /* 接口文档-访问路径 */
  uri?: string;
  method?: string;
  contentType?: string;

  /* 数据模型 */
  /* 本数据模型是否映射为数据表实体 */
  db?: {
    /* 数据库类型 */
    type: 'postgres' | 'mysql' | 'mongodb';
    /* 表名 */
    name?: string;
  };

  /**
   * 标记该文件是否只包含元数据
   */
  isMetadataOnly?: boolean;
  /**
   * 标记该文件是否是文档
   */
  isDocument?: boolean;
  /**
   * 组件类型
   * Page: 页面
   * Component: 组件
   */
  componentType?: string;
  /**
   * 标记文件是否已被修改但未保存
   */
  isDirty?: boolean;
  /**
   * 标记文件是否已被修改但未同步到远程
   */
  isUnsaved?: boolean;
  /**
   * 标记文件内容是否已完全加载（包含源代码等）
   */
  isFullyLoaded?: boolean;
  /**
   * 标记文件最后一次全量加载的时间
   */
  lastFullLoadTime?: number;
  /**
   * 文件内容哈希值（缓存）
   */
  contentHash?: string;
  /**
   * 哈希计算时间戳
   */
  hashTimestamp?: number;
  /**
   * 哈希算法
   */
  hashAlgorithm?: string;
}

export interface FileVersion {
  id?: string;
  path: string;
  version: number;
  content?: any;
  timestamp: number;
  author?: string;
  message?: string;
  projectId?: string;
  /** 文件内容哈希值 */
  contentHash?: string;
  /** 文件内容大小（字节） */
  contentSize?: number;
}

export interface FileSystemEntry {
  path: string;
  content: any;
  stats: FileSystemStats;
}

export interface WatchCallback<T> {
  (change: T): void;
}

export interface WriteOptions {
  author?: string;
  message?: string;
  shadowSpace?: string;
  noRecordChange?: boolean;
  /**
   * 只写入文件，不触发后续转换
   */
  onlyWrite?: boolean;
  /**
   * 指定哈希（目的是都以JSON云端版本的hash为主）
   */
  hash?: string;
  /**
   * 写入模式，用于记录最后编辑方式
   * vi: 可视化编辑模式
   * code: 代码编辑模式
   */
  writeMode?: 'vi' | 'code';
  /**
   * 跳过 TSX 规范检查
   */
  skipTSXCheck?: boolean;
  /**
   * 严格 TSX 检查模式，发现错误时阻止写入
   */
  strictTSXCheck?: boolean;

  skipPushShadowSpace?: boolean;
}

// IndexedDB 存储接口
export interface IDBSchema {
  files: {
    key: [string, string]; // [projectId, path]
    value: FileSystemEntry & { projectId: string };
    indexes: {
      'by-project': string; // projectId
    };
  };
  versions: {
    key: number; // auto-increment
    value: FileVersion & { projectId: string };
    indexes: {
      'by-project-path': [string, string]; // [projectId, path]
    };
  };
  changes: {
    key: number; // auto-increment
    value: FileChange<any>;
    indexes: {
      'by-project-path': [string, string]; // [projectId, path]
    };
  };
}

export interface FileSystemNodeBase {
  path: string;
  stats: FileSystemStats;
}

export interface FileInfo extends FileSystemNodeBase {
  type: 'file';
}

export interface DirectoryInfo extends FileSystemNodeBase {
  type: 'directory';
  name?: string;
  folderPath?: string;
  desc?: string;
  typeEntity?: any;
}

export type FileSystemNode = FileInfo | DirectoryInfo;

export interface MergeResult {
  success: boolean;
  conflicts?: {
    path: string;
    content: {
      ours: any;
      theirs: any;
      base?: any;
    };
  }[];
  mergeCommit?: LcCommit;
}
